# SQL Injection
ํด์ปค์ ์ํด ์กฐ์๋ SQL ์ฟผ๋ฆฌ๋ฌธ์ด ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ทธ๋๋ก ์ ๋ฌ๋์ด ๋น์ ์์ ๋ช ๋ น์ ์คํ์ํค๋ ๊ณต๊ฒฉ ๊ธฐ๋ฒ
# ๊ณต๊ฒฉ ๋ฐฉ๋ฒ
# 1) ์ธ์ฆ ์ฐํ
๋ณดํต ๋ก๊ทธ์ธ์ ํ ๋, ์์ด๋์ ๋น๋ฐ๋ฒํธ๋ฅผ input ์ฐฝ์ ์ ๋ ฅํ๊ฒ ๋๋ค. ์ฝ๊ฒ ์ดํดํ๊ธฐ ์ํด ๊ฐ๋ฒผ์ด ์๋ฅผ ๋ค์ด๋ณด์. ์์ด๋๊ฐ abc, ๋น๋ฐ๋ฒํธ๊ฐ ๋ง์ฝ 1234์ผ ๋ ์ฟผ๋ฆฌ๋ ์๋์ ๊ฐ์ ๋ฐฉ์์ผ๋ก ์ ์ก๋ ๊ฒ์ด๋ค.
SELECT * FROM USER WHERE ID = "abc" AND PASSWORD = "1234";
SQL Injection์ผ๋ก ๊ณต๊ฒฉํ ๋, input ์ฐฝ์ ๋น๋ฐ๋ฒํธ๋ฅผ ์ ๋ ฅํจ๊ณผ ๋์์ ๋ค๋ฅธ ์ฟผ๋ฆฌ๋ฌธ์ ํจ๊ป ์ ๋ ฅํ๋ ๊ฒ์ด๋ค.
1234; DELETE * USER FROM ID = "1";
๋ณด์์ด ์๋ฒฝํ์ง ์์ ๊ฒฝ์ฐ, ์ด์ฒ๋ผ ๋น๋ฐ๋ฒํธ๊ฐ ์์ด๋์ ์ผ์นํด์ True๊ฐ ๋๊ณ ๋ค์ ์์ฑํ DELETE ๋ฌธ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํฅ์ ์ค ์๋ ์๊ฒ ๋๋ ์น๋ช ์ ์ธ ์ํฉ์ด๋ค.
์ด ๋ฐ์๋ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฌธ์ WHERE ์ ์ OR๋ฌธ์ ์ถ๊ฐํ์ฌ '1' = '1'
๊ณผ ๊ฐ์ true๋ฌธ์ ์์ฑํ์ฌ ๋ฌด์กฐ๊ฑด ์ ์ฉ๋๋๋ก ์์ ํ ๋ค DB๋ฅผ ๋ง์๋๋ก ์กฐ์ํ ์๋ ์๋ค.
# 2) ๋ฐ์ดํฐ ๋ ธ์ถ
์์คํ ์์ ๋ฐ์ํ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ด์ฉํด ๊ณต๊ฒฉํ๋ ๋ฐฉ๋ฒ์ด๋ค. ๋ณดํต ์๋ฌ๋ ๊ฐ๋ฐ์๊ฐ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๋ฉด์์ ๋์์ ๋ฐ์ ์ ์๋ ์กด์ฌ๋ค. ํด์ปค๋ค์ ์ด๋ฅผ ์ญ์ด์ฉํด ์ ์์ ์ธ ๊ตฌ๋ฌธ์ ์ฝ์ ํ์ฌ ์๋ฌ๋ฅผ ์ ๋ฐ์ํจ๋ค.
์ฆ ์๋ฅผ ๋ค๋ฉด, ํด์ปค๋ GET ๋ฐฉ์์ผ๋ก ๋์ํ๋ URL ์ฟผ๋ฆฌ ์คํธ๋ง์ ์ถ๊ฐํ์ฌ ์๋ฌ๋ฅผ ๋ฐ์์ํจ๋ค. ์ด์ ํด๋นํ๋ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ฉด, ์ด๋ฅผ ํตํด ํด๋น ์น์ฑ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๊ตฌ์กฐ๋ฅผ ์ ์ถํ ์ ์๊ณ ํดํน์ ํ์ฉํ๋ค.
# ๋ฐฉ์ด ๋ฐฉ๋ฒ
# 1) input ๊ฐ์ ๋ฐ์ ๋, ํน์๋ฌธ์ ์ฌ๋ถ ๊ฒ์ฌํ๊ธฐ
๋ก๊ทธ์ธ ์ , ๊ฒ์ฆ ๋ก์ง์ ์ถ๊ฐํ์ฌ ๋ฏธ๋ฆฌ ์ค์ ํ ํน์๋ฌธ์๋ค์ด ๋ค์ด์์ ๋ ์์ฒญ์ ๋ง์๋ธ๋ค.
# 2) SQL ์๋ฒ ์ค๋ฅ ๋ฐ์ ์, ํด๋นํ๋ ์๋ฌ ๋ฉ์์ง ๊ฐ์ถ๊ธฐ
view๋ฅผ ํ์ฉํ์ฌ ์๋ณธ ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ ์ด๋ธ์๋ ์ ๊ทผ ๊ถํ์ ๋์ธ๋ค. ์ผ๋ฐ ์ฌ์ฉ์๋ view๋ก๋ง ์ ๊ทผํ์ฌ ์๋ฌ๋ฅผ ๋ณผ ์ ์๋๋ก ๋ง๋ ๋ค.
# 3) preparestatement ์ฌ์ฉํ๊ธฐ
preparestatement๋ฅผ ์ฌ์ฉํ๋ฉด, ํน์๋ฌธ์๋ฅผ ์๋์ผ๋ก escaping ํด์ค๋ค. (statement์๋ ๋ค๋ฅด๊ฒ ์ฟผ๋ฆฌ๋ฌธ์์ ์ ๋ฌ์ธ์ ๊ฐ์
?
๋ก ๋ฐ๋ ๊ฒ) ์ด๋ฅผ ํ์ฉํด ์๋ฒ ์ธก์์ ํํฐ๋ง ๊ณผ์ ์ ํตํด์ ๊ณต๊ฒฉ์ ๋ฐฉ์ดํ๋ค.
โ - ์กฐ์ธ(Join) - SQL vs NOSQL โ